在 Android 系統中,安全性與隱私保護是設計的關鍵考量。
應用程式(App)常需要保存敏感資料,例如:
Android Keystore 是 Android Security Framework 的核心之一,它負責:
+---------------------------------------------------------------+
| Android Security Stack |
|---------------------------------------------------------------|
| Application Layer (Java/Kotlin API) |
| └── android.security.keystore.KeyStore, KeyGenParameterSpec|
| |
| Framework Layer |
| └── Keystore Service (Binder IPC, system_server) |
| |
| Native Layer |
| └── Keymaster HAL (Keymaster 3.0/4.0/4.1) |
| |
| Hardware Layer |
| └── TEE / StrongBox / HSM (Hardware-backed Keystore) |
+---------------------------------------------------------------+
三、Keystore 的工作流程
Android Keystore 的整體運作可分為五個階段:
val keyGen = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
val spec = KeyGenParameterSpec.Builder(
"mySecretKey",
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setUserAuthenticationRequired(true)
.build()
keyGen.init(spec)
keyGen.generateKey()
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(30)
代表金鑰只能在使用者通過身份驗證後的 30 秒內使用。
Keymaster(Key Management Service HAL)是 Android Framework 與硬體安全的橋樑。它提供以下功能:
版本演進:
| 版本 | Android 版本 | 新功能 |
|---|---|---|
| v1.0 | Android 4.3 | 基本金鑰管理 |
| v3.0 | Android 8.0 | 與 TEE 整合 |
| v4.0 | Android 9.0 | 支援 StrongBox |
| v4.1 | Android 11 | 改進 attestation 與 rollback 保護 |
StrongBox 是獨立於 TEE 的硬體安全元件(如 Titan M、Secure Element)。它能提供更高安全等級的金鑰保護與防回滾機制。
比較表:
| 項目 | TEE-backed Keystore | StrongBox-backed Keystore |
|---|---|---|
| 實現方式 | SoC 內部安全區域 | 獨立安全晶片 |
| 安全等級 | 高 | 極高 |
| 可抵抗攻擊 | 軟體層、Root 攻擊 | 實體與側信道攻擊 |
| 適用場景 | 一般應用 | 金融、支付、安全認證 |
Android 在 Java 層提供統一的 Provider:Provider: AndroidKeyStore
應用程式可透過標準 javax.crypto 或 java.security API 使用:
| 類別 | 功能 |
|---|---|
| KeyStore | 存取金鑰條目 |
| KeyGenerator | 產生對稱金鑰 |
| KeyPairGenerator | 產生非對稱金鑰 |
| Cipher | 加密與解密 |
| Signature | 數位簽章 |
| KeyInfo | 查詢金鑰屬性 |
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
cipher.init(Cipher.ENCRYPT_MODE, secretKey)
val encryptedData = cipher.doFinal(plainText)
val iv = cipher.iv
val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
val privateKey = keyStore.getKey("myKeyAlias", null) as PrivateKey
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey)
signature.update(data)
val signedData = signature.sign()
3.生物辨識與金鑰結合
結合 BiometricPrompt,確保只有本人操作可觸發加密運算。
Keystore 並非孤立存在,它與 Android 的整體安全模型緊密結合:
+-------------------------------------------------------------+
| Android Security Architecture |
|-------------------------------------------------------------|
| App Sandbox | PermissionManager | SELinux | Verified Boot |
|-------------------------------------------------------------|
| Keystore / Keymaster / StrongBox |
+-------------------------------------------------------------+
隨著 Android 版本演進,Google 持續加強 Keystore 的功能:
| 關鍵概念 | 說明 |
|---|---|
| Keystore | Android 的金鑰管理框架,確保金鑰安全使用 |
| Keymaster | 介於 Framework 與硬體安全模組的 HAL 層 |
| StrongBox | 硬體級安全儲存區,防範物理攻擊 |
| API 使用 | 透過 KeyStore, Cipher, Signature 等標準 API |
| 生物認證整合 | 可與指紋 / 臉部解鎖綁定金鑰使用權限 |
| 安全保證 | 金鑰永不離開 Keystore,受硬體保護與系統策略約束 |
Keystore 是 Android 安全的最後防線
Keystore 不僅僅是一個加密 API,它是 Android 整體安全生態的核心元件。
它確保金鑰的全生命週期安全,從產生、儲存、使用、到銷毀,都受到嚴格控制。
對於開發者而言,善用 Keystore 不只是「安全最佳實踐」,更是保護用戶信任的根本。